作者:mobiledu2502912677 | 来源:互联网 | 2024-09-29 16:30
篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL还能这样玩---第五篇之视图应该这样玩相关的知识,希望对你有一定的参考价值。
mysql还能这样玩---第五篇之视图应该这样玩
- 什么是视图
- 临时表原理
- 视图原理
- 视图的CRUD
- 视图对性能的影响
什么是视图
视图相对于普通表而言,有下面这些优势:
临时表原理
什么是临时表:MySQL用于存储一些中间结果集的表,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。为什么会产生临时表:一般是由于复杂的SQL导致临时表被大量创建
临时表分为两种,一种是内存临时表,一种是磁盘临时表。
内存临时表采用的是memory存储引擎,磁盘临时表采用的是myisam存储引擎(磁盘临时表也可以使用innodb存储引擎,通过internal_tmp_disk_storage_engine参数来控制使用哪种存储引擎,从mysql5.7.6之后默认为innodb存储引擎,之前版本默认为myisam存储引擎)。分别通过Created_tmp_disk_tables 和 Created_tmp_tables 两个参数来查看产生了多少磁盘临时表和所有产生的临时表(内存和磁盘)。
内存临时表空间的大小由两个参数控制:tmp_table_size 和 max_heap_table_size 。
一般来说是通过两个参数中较小的数来控制内存临时表空间的最大值,而对于开始在内存中创建的临时表,后来由于数据太大转移到磁盘上的临时表,只由max_heap_table_size参数控制。针对直接在磁盘上产生的临时表,没有大小控制。
下列操作会使用到临时表:
Mysql还会阻止内存表空间的使用,直接使用磁盘临时表:
视图原理
总结:在定义视图的时候,尽可能不要让其走临时表算法,而选择合并算法
视图的CRUD
创建视图
create view 视图名
as
查询语句;
或者
create or replace 视图名
as
查询语句;
使用视图
select v.wID from v;
修改视图
create or replace 视图名
as
查询语句;
或者
alter view 视图名
as
查询语句;
更新视图注意事项
视图的可更新性和查询的定义有关系,以下类型的视图是不可更新的
为什么上面的视图都是不可更新的呢? 看底层实现
重点在于使用临时表算法实现的视图是不可以被更新的,在原表和视图无法建立一一映射的条件下,就会使用临时表算法
举例: 以下视图都是不可更新的
包含聚合函数:
create or replace view pay_sum as
select staff_id,sum(amount) from payment group by staff_id;
常量视图:
create or replace view pi as
select 3.14 as pi
select中包含子查询:
create view city_view as
select (select city from city where city_id=1);
WITH [CASCADED | LOCAL ] CHECK OPTION决定了是否可以更新记录使其不再满足视图的条件,这个选项与ORACLE数据库中的选项是类似的:
没有明确LOCAL 和 CASCADED 的前提下,默认为CASCADED
举例: 对payment创建两层视图,并进行更新操作
create view payment_view as
select payment_id,amount from payment
where amount < 10
with check option
create view payment_view1 as
select payment_id,amount from payment_view
where amount > 5
with local check option
create view payment_view2 as
select payment_id,amount from payment
where amount > 5
with cascaded check option
尝试更新:
成功:
update payment_view1 set amount&#61;10
where payment_id&#61;3;
失败:
update payment_view2 set amount&#61;10
where payment_id&#61;3;
payment_view1是WITH LOCAL CHECK OPTION的&#xff0c;所以只要满足本视图的条件就可以更新&#xff0c;但是payment_view2是WITH CASCADED CHECK OPTION的&#xff0c;必须满足针对该视图的所有视图才可以更新&#xff0c;因为更新后记录不再满足payment_view 的条件&#xff0c;所以更新操作提示错误退出。
删除视图
前提拥有删除该视图的DROP权限
drop view v1,v2,v3...
查看视图
show tables命令从mysql 5.1开始&#xff0c;会显示表和视图&#xff0c;不存在单独的show views命令
显示视图信息
show table status from 数据库名 like 表名/视图名
查看视图定义信息
show create view
通过information_schema.views也可以查看视图的相关信息
视图对性能的影响
注意:是在使用临时表算法构建的视图中&#xff0c;无法使用索引&#xff0c;无法使用外层where条件在存储引擎层过滤掉不需要的行数